package edu.uoc.tds.server;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.swing.JOptionPane;

import edu.uoc.tds.bean.*;
import edu.uoc.tds.common.*;
import java.sql.PreparedStatement;
import java.util.Date;

public class GestorSubTablas {

    private Connection conn = null;
    private UtilLenguaje txt = null;

    public GestorSubTablas(Connection conn) {
        this.conn = conn;
    }

    public Vector<TipoEvento> listaTipoEventos() throws Exception {
        Vector<TipoEvento> vV = new Vector<TipoEvento>();
        ResultSet rs = null;
        Statement st = null;
        try {
            String sSQL = "SELECT id_tipo_evento, descripcion ";
            sSQL += " FROM tipoevento ";
            sSQL += " ORDER BY descripcion ";

            st = getConnection().createStatement();
            rs = st.executeQuery(sSQL);
            while (rs.next()) {
                Integer idTipoEvento = new Integer(rs.getInt("id_tipo_evento"));
                String descripcion = rs.getString("descripcion");

                TipoEvento tipoEvento = new TipoEvento(idTipoEvento, descripcion);
                vV.add(tipoEvento);
            }
        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
        }
        return vV;
    }

    public Vector<Universidad> listaUniversidades() throws Exception {
        Vector<Universidad> vV = new Vector<Universidad>();
        ResultSet rs = null;
        Statement st = null;
        try {
            String sSQL = "SELECT id_universidad, nombre ";
            sSQL += " FROM universidad ";
            sSQL += " ORDER BY nombre ";

            st = getConnection().createStatement();
            rs = st.executeQuery(sSQL);
            while (rs.next()) {
                Integer idUniversidad = new Integer(rs.getInt("id_universidad"));
                String descripcion = rs.getString("nombre");

                Universidad universidad = new Universidad(idUniversidad, descripcion);
                vV.add(universidad);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
        }
        return vV;
    }

    public Vector<Pais> listaPaises() throws Exception {
        Vector<Pais> vV = new Vector<Pais>();
        ResultSet rs = null;
        Statement st = null;
        try {
            String sSQL = "SELECT id_pais, nombre_pais ";
            sSQL += " FROM pais ";
            sSQL += " ORDER BY nombre_pais ";

            st = getConnection().createStatement();
            rs = st.executeQuery(sSQL);
            while (rs.next()) {
                Integer idPais = new Integer(rs.getInt("id_pais"));
                String nombre = rs.getString("nombre_pais");

                Pais pais = new Pais(idPais, nombre);
                vV.add(pais);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
        }
        return vV;
    }

    public Connection getConnection() {
        return conn;
    }

    public Universidad getUniversidad(Integer idUniversidad) throws Exception {
        Universidad universidad = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        try {
            String sSQL = "SELECT nombre ";
            sSQL += " FROM universidad ";
            sSQL += " where id_universidad=? ";

            ps = getConnection().prepareStatement(sSQL);
            ps.setInt(1, idUniversidad);

            rs = ps.executeQuery();

            if (rs.next()) {
                String nombre = rs.getString("nombre");
                universidad = new Universidad(idUniversidad, nombre);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
        return universidad;
    }

    public Contacto getContacto(Integer idContacto) throws Exception {
        Contacto contacto = null;
        Pais pais = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        try {
            String sSQL = "SELECT domicilio, cp, localidad, estado, id_pais, email, web, telefono, fecha_alta ";
            sSQL += " FROM contacto ";
            sSQL += " where id_contacto=? ";

            ps = getConnection().prepareStatement(sSQL);
            ps.setInt(1, idContacto);

            rs = ps.executeQuery();
            if (rs.next()) {
                String domicilio = rs.getString("domicilio");
                Integer estado = new Integer(rs.getInt("estado"));
                Date fechaAlta = rs.getDate("fecha_alta");
                Integer cp = new Integer(rs.getInt("cp"));
                String localidad = rs.getString("localidad");
                Integer idPais = new Integer(rs.getInt("id_pais"));
                String email = rs.getString("email");
                String web = rs.getString("web");
                String telefono = rs.getString("telefono");

                pais = getPais(idPais);
                contacto = new Contacto(idContacto, domicilio, cp, localidad, pais, email, web, telefono, fechaAlta, estado);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
        return contacto;
    }

    public Pais getPais(Integer idPais) throws Exception {
        Pais pais = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        try {
            String sSQL = "SELECT  nombre_pais ";
            sSQL += " FROM pais ";
            sSQL += " where id_pais=? ";

            ps = getConnection().prepareStatement(sSQL);
            ps.setInt(1, idPais);

            rs = ps.executeQuery();

            if (rs.next()) {
                String nombre = rs.getString("nombre_pais");
                pais = new Pais(idPais, nombre);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
        return pais;
    }

    public Integer altaContacto(String domicilio, Integer cp, String localidad,
            Integer idPais, String email, String web, String telefono) throws Exception {

        PreparedStatement ps = null;
        ResultSet rs=null;
        Integer seq=null;
        Statement st = null;
        try {

            String sQLSeq= "SELECT NEXTVAL ('SEQ_CONTACTO') as seq;" ;
            st = getConnection().createStatement();
            rs= st.executeQuery(sQLSeq);

            if (rs.next()){
                seq = new Integer(rs.getInt("seq"));
            }

            String sSQL = "INSERT INTO CONTACTO (id_contacto, domicilio, cp, localidad, id_pais, email, web, "
                    + " telefono, estado, fecha_alta) "
                    + " VALUES (?,?,?,?,?,?,?,?,?,?)";

            ps = getConnection().prepareStatement(sSQL);
            ps.setInt(1, seq);
            ps.setString(2, domicilio);
            ps.setInt(3, cp);
            ps.setString(4, localidad);
            ps.setInt(5, idPais);
            ps.setString(6, email);
            ps.setString(7, web);
            ps.setString(8, telefono);
            ps.setInt(9, Variables.estadoActivo);
            java.sql.Date sqlFechaAlta = new java.sql.Date(new Date().getTime());
            ps.setDate(10, sqlFechaAlta);

            ps.execute();
         
            this.getConnection().setAutoCommit(true);

        } catch (SQLException eSQL) {
            if (eSQL.getSQLState().equals(GestorDisco.SQL_STATE_UNIQUE_VIOLATION)) {
                JOptionPane.showMessageDialog(null,
                        txt.getMessage("err.subtablas.constraint") + "\n" + eSQL.getMessage(),
                        txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null,
                        txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                        txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception eE) {
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {

            if (ps != null) {
                ps.close();
            }

            if (st != null) {
                st.close();
            }

            if (rs != null) {
                rs.close();
            }
        }
        return seq;
    }




    public void editarContacto(Contacto contactoEditar, String domicilio, Integer cp, String localidad,
            Integer idPais, String email, String web, String telefono) throws Exception {

        PreparedStatement ps = null;
       
      
        try {

            String sSQL = "UPDATE CONTACTO SET domicilio=?,cp=?, localidad=?, id_pais=?, "
                    + "email=?, web=?, telefono=? "
                    + " WHERE id_contacto=? " ;

            ps = getConnection().prepareStatement(sSQL);
            ps.setString(1, domicilio);
            ps.setInt(2, cp);
            ps.setString(3, localidad);
            ps.setInt(4, idPais);
            ps.setString(5, email);
            ps.setString(6, web);
            ps.setString(7, telefono);
            ps.setInt(8, contactoEditar.getIdContacto());

            ps.execute();

            this.getConnection().setAutoCommit(true);

        } catch (SQLException eSQL) {
            if (eSQL.getSQLState().equals(GestorDisco.SQL_STATE_UNIQUE_VIOLATION)) {
                JOptionPane.showMessageDialog(null,
                        txt.getMessage("err.subtablas.constraint") + "\n" + eSQL.getMessage(),
                        txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null,
                        txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                        txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception eE) {
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {

            if (ps != null) {
                ps.close();
            }
        }

    }



    public Vector<TipoDocumento> listaTipoDoc() throws Exception {
        Vector<TipoDocumento> vV = new Vector<TipoDocumento>();
        ResultSet rs = null;
        Statement st = null;
        try {
            String sSQL = "SELECT id_tipo_documento, descripcion_documento ";
            sSQL += " FROM TIPODOCUMENTO ";
            sSQL += " ORDER BY descripcion_documento ";

            st = getConnection().createStatement();
            rs = st.executeQuery(sSQL);
            while (rs.next()) {
                Integer idTipoDoc = new Integer(rs.getInt("id_tipo_documento"));
                String descripcion = rs.getString("descripcion_documento");

                TipoDocumento tipoDoc = new TipoDocumento(idTipoDoc, descripcion);
                vV.add(tipoDoc);
            }
        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
        }
        return vV;
    }


    
    public DocumentoIdentificacion getDocIden(Integer idDocIden) throws Exception {
        DocumentoIdentificacion docIden = null;
        GestorSubTablas gS=null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        try {
            gS=new GestorSubTablas(getConnection());
            
            String sSQL = "SELECT  id_tipo_documento, id_pais, numero_documento ";
            sSQL += " FROM documentoIdentificacion ";
            sSQL += " where id_documento_identificacion=? ";

            ps = getConnection().prepareStatement(sSQL);
            ps.setInt(1, idDocIden);

            rs = ps.executeQuery();

            if (rs.next()) {
                Integer idTipo = rs.getInt("id_tipo_documento");
                Integer idPais = rs.getInt("id_pais");
                String numDoc = rs.getString("numero_documento");
                Pais pais=gS.getPais(idPais);
                TipoDocumento tipoDoc=new TipoDocumento(idTipo);                
                docIden = new DocumentoIdentificacion(pais,tipoDoc, numDoc);
            }

        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
        }
        return docIden;
    }


    public Vector<TipoEvento> listaTipoEventosCelebrados(Integer IdCentro) throws Exception {
        Vector<TipoEvento> vV = new Vector<TipoEvento>();

        // AÃ±adir un tipo evento para hacer referencia a todos.
        TipoEvento tipoEvento1 = new TipoEvento(0, "---");
        vV.add(tipoEvento1);

        ResultSet rs = null;
        Statement st = null;
        try {
            // Buscar los tipos de evento en los eventos celebrados.
            String sSQL = "SELECT distinct e.id_tipo_evento, te.descripcion";

            if (IdCentro > 0){
                sSQL += " FROM evento e, tipoevento te, centrodocente c";
            }else{
                sSQL += " FROM evento e, tipoevento te";
            }

            sSQL += " WHERE e.id_tipo_evento = te.id_tipo_evento";

            if (IdCentro > 0){
                sSQL += " AND e.id_centro = c.id_centro";
                sSQL += " AND c.id_centro = " + IdCentro;
            }

            st = getConnection().createStatement();
            rs = st.executeQuery(sSQL);
            while (rs.next()) {
                Integer idTipoEvento = new Integer(rs.getInt("id_tipo_evento"));
                String descripcion = rs.getString("descripcion");

                TipoEvento tipoEvento = new TipoEvento(idTipoEvento, descripcion);
                vV.add(tipoEvento);
            }
        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
        }
        return vV;
    }

     public Vector<Evento> listaEventosCelebrados(Integer IdUniversidad, Integer IdCentro) throws Exception {
        Vector<Evento> vV = new Vector<Evento>();

        ResultSet rs = null;
        PreparedStatement ps = null;
        //Statement st = null;
        try {
            // Buscar los tipos de evento en los eventos celebrados.
            String sSQL = "SELECT distinct e.id_evento, e.nombre";

            sSQL += " FROM evento e";
            sSQL += " WHERE e.fecha_fin < ?";

            if (IdUniversidad != 0){
                sSQL += " AND e.id_universidad = " + IdUniversidad;
            }

            if (IdCentro != 0){
                sSQL += " AND e.id_centro = " + IdCentro;
            }

            //st = getConnection().createStatement();
            //rs = st.executeQuery(sSQL);

            ps = getConnection().prepareStatement(sSQL);
            java.util.Date vDate = new java.util.Date();
            ps.setDate(1, new java.sql.Date(vDate.getTime()));
            rs = ps.executeQuery();

            while (rs.next()) {
                Integer idEvento = new Integer(rs.getInt("id_evento"));
                String descripcion = rs.getString("nombre");

                Evento evento = new Evento(idEvento, descripcion);
                vV.add(evento);
            }
        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (ps != null) {
                ps.close();
            }
            //if (st != null) {
            //    st.close();
            //}
        }
        return vV;
    }


      public Vector<Usuario> listaUsuariosPorCentro(Integer IdUniversidad, Integer IdCentro) throws Exception {
        Vector<Usuario> vV = new Vector<Usuario>();

        ResultSet rs = null;
        Statement st = null;

        try {
            // Buscar los tipos de evento en los eventos celebrados.
            String sSQL = "SELECT distinct us.codigo, us.nombre, us.apellidos";

            sSQL += " FROM usuario us left join centrodocente c on (us.id_centro = c.id_centro)"
                  + "  left join universidad u on u.id_universidad = c.id_universidad";

            String sSQLWhere = "";

            if (IdUniversidad != 0){
                if (sSQLWhere == "") {
                    sSQLWhere += " WHERE";
                }else{
                    sSQLWhere += " AND";
                }

                sSQLWhere += " u.id_universidad = " + IdUniversidad;
            }

            if (IdCentro != 0){
                if (sSQLWhere == "") {
                    sSQLWhere += " WHERE";
                }else{
                    sSQLWhere += " AND";
                }

                sSQLWhere += " c.id_centro = " + IdCentro;
            }

           sSQL += sSQLWhere;

           sSQL += " ORDER BY us.apellidos, us.nombre";

            st = getConnection().createStatement();
            rs = st.executeQuery(sSQL);

            while (rs.next()) {
                String codigo = rs.getString("codigo");
                String nombre = rs.getString("apellidos") + ", " + rs.getString("nombre");

                Usuario usuario = new Usuario(codigo, nombre);
                vV.add(usuario);
            }
        } catch (SQLException eSQL) {
            eSQL.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.bbdd") + "\n" + eSQL.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            eE.fillInStackTrace();
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("err.subtablas.generico") + "\n" + eE.getMessage(),
                    txt.getMessage("err.subtablas"), JOptionPane.ERROR_MESSAGE);
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (st != null) {
                st.close();
            }
        }
        return vV;
    }


}
